'''
以K210为客户端，连接到同一局域网下的设备上，向它传输数据
'''
from fpioa_manager import *
from fpioa_manager import fm
import network, socket, time, sensor, image
import lcd
from machine import UART
from maix import GPIO
from board import board_info

fm.register(8, fm.fpioa.GPIOHS0, force=True)  # 使能ESP8285
#pin:功能映射脚、function：芯片功能、force：强制分配，如果为True，则可以多次对同一个引脚注册;False则不允许同一引脚多次注册
wifi_en=GPIO(GPIO.GPIOHS0,GPIO.OUT)
#ID:使用的GPIO引脚，MODE:GPIO模式
fm.register(13, fm.fpioa.UART2_RX, force=True)
fm.register(14, fm.fpioa.UART2_TX, force=True)

def wifi_enable(en):
    global wifi_en  #把GPIO的引脚状态设为全局变量
    wifi_en.value(en)  #如果en有值则修改 GPIO 的引脚状态
                       #如果en无值则读取 GPIO 的引脚状态

def wifi_reset():
    global uart
    wifi_enable(0)
    time.sleep_ms(200) #延时200 ms
    wifi_enable(1)  #使能wifi
    time.sleep(2)  #延时2 s
    uart = UART(UART.UART2,115200,timeout=1000, read_buf_len=4096)
    #uart:UART 号，使用指定的 UART
    #baudrate:UART 波特率
    #timeout: 串口接收超时时间
    #read_buf_len： 串口接收缓冲，串口通过中断来接收数据，如果缓冲满了，将自动停止数据接收
    #读取串口缓冲中的数据到 tmp 中
    uart.write("AT+UART_CUR=921600,8,1,0,0\r\n")
    #发送数据
    print(uart.read())#打印串口读取的数据
    uart = UART(UART.UART2,921600,timeout=1000, read_buf_len=4096)
    uart.write("AT\r\n")
    tmp = uart.read()
    print(tmp)

    if not (tmp == b"\r\nOK\r\n" or tmp == b'AT\r\r\n\r\nOK\r\n'):   #检查tmp是否以 OK\r\n 结尾，是的话就返回True
        print("reset fail")
        return None
    try:
        nic = network.ESP8285(uart)  #尝试初始化ESP8285，如果失败就跳到下列的 except 语句中
    except Exception:
        return None
    return nic

server_ip = "BearPi_Pico_H3863"
server_port = "123456789"  # 热点的账号和密码

nic = None  #清空 nic 内值

while True:
    if not nic or not nic.isconnected():
        nic = wifi_reset()  #如果wifi没有连接就重新使能，如果使能成功会将nic赋值True
    if not nic:  #使能失败
        print("wifi 重置失败")
        continue  #进行下一轮使能
    try:
        print("尝试连接wifi")
        nic.connect(server_ip, server_port)  #尝试连接wifi
        ifconfig = nic.ifconfig() #查看wifi连接信息
        print("wifi连接成功！当前网络信息如下：\nIP地址"+ifconfig[0]+"\n子网掩码"+ifconfig[1]+"\n网关"+ifconfig[2]+"\nDNS服务器"+ifconfig[3]+"\n")
        break
    except Exception:
        print("WiFi 连接失败")
        continue  #连接失败进行下一轮连接
    if not nic.isconnected():
        print("WiFi 连接失败")
        continue

while True:
# send byte
    addr = socket.getaddrinfo('192.168.43.1', 5001)[0][-1]  # 获取服务器ip和端口。比如是电脑作服务器，那么就在cmd里用ipconfig看它的ip
    sock = socket.socket()  #使用给定的地址系列,套接字类型和协议号创建一个新套接字
    try:
        sock.connect(addr)  #尝试连接服务器
        print("连接成功")
    except Exception as e: #返回错误信息
        print("连接失败:", e)
        sock.close()
        time.sleep(1)
        continue
    sock.settimeout(5)

    err = 0

    while True:
        if err >=10:  #如果err大于
            print("socket broken")
            break
    ##############以下为修改区域##################
        print("正在准备发送数据")
        sock.send(b"\x2D")
        time.sleep(2)
    print("close now")
    ##############以上为修改区域##################
    sock.close()
